Technical Q&A

TB 60 - 複数のコードフラグメントを持つコンテクストメニュープラグイン(1999 年 4 月 5 日)

Q: これまで正常に動作していたコンテクストメニュープラグインが、2 つ目のコードフラグメント (私の場合はアプリケーションです) をファイルに追加した結果、正常に動作しなくなりました。メニューの中に、同じメニュー項目が 2 つ現れてしまいます。そのプラグインを調べてみると、Initialize、ExamineContext、PostMenuCleanup の各メソッドが 2 回呼び出されていることがわかりました。どういうことでしょうか?

A: メニューマネージャの 'cfrg' リソースパーサがやや不完全なことが原因です。「cfrg」リソースパーサは、ファイル中の各プラグインをインスタンス化しようとするときに、最初のプラグインだけを繰り返しインスタンス化してしまいます。このため、複数のプラグインを作成する必要がある場合は、プラグインファイルも複数作成する必要があります。通常はメニュー項目 1 つに対して個別にフラグメントを作成するよりも、1 つのフラグメントで複数のメニュー項目を追加するほうが簡潔なため、この問題に影響を受けるデベロッパはさほど多くはないはずです。

ご質問のケースでは「複数のメニュー項目やプラグインがほしい」というわけではなく、ただ単に「コードフラグメントを複数利用したい」ということですから、次のようなコードを使えば問題を回避できます。

    static MyPlug *gMyPlugInstance; // Radar 1663652 の回避策
         
    OSStatus MyPlug::Initialize (Environment *, FSSpec *)
    {
        if (!gMyPlugInstance)
            gMyPlugInstance = this;
         
        return noErr;
    }
         
    OSStatus MyPlug::ExamineContext
        (Environment *, AEDesc *aeContext, SInt32 timeOut,
            AEDescList *commandList, Boolean *needMoreTime)
    {
        OSStatus err = noErr;
         
        *needMoreTime = false;
         
        if (gMyPlugInstance == this)
        {
            if (aeContext)
            {
                // コンテクストを判断し、適切な場合はメニュー項目に追加
            }
        }
         
        return err;
    }
         


-- Pete Gontier
Worldwide Developer Technical Support

Technical Q&As | Contents
Previous Question | Next Question

To contact us, please use the Contact Us page.